﻿#include<iostream>
using namespace std;

//class A
//{
//public:
//	A(int a = 4) //该缺省值会作为_a1的参数
//		: _a2(_a1)
//		,_a1(a)
//	{
//	}
//	void Print() {
//		cout << _a1 << " " << _a2 << endl;
//	}
//private:
//	int _a2 = 2;
//	int _a1 = 2;
//};
//int main()
//{
//	A aa;
//	aa.Print();
//}


//template <typename T>
////T Max(T a, T b);  函数模板不能声明
//T Max(T a, T b)
//{
//	if (a > b)
//		return a;
//	return b;
//}
//int main()
//{
//	int i1 = 10, i2 = 20;
//	double d1 = 1.5, d2 = 0.5;
//	cout << Max(i1, i2) << endl;
//	cout << Max(d1, d2) << endl;
//}

//#include<iostream>
//using namespace std;
//
//class Date
//{
//public:
//	//带参构造函数
//	Date(int year, int month, int day)
//	{
//		_year = year;
//		_month = month;
//		_day = day;
//	}
//	void Print()
//	{
//		cout << _year << '/' << _month << '/' << _day << endl;
//	}
//private :
//	int _year;
//	int _month;
//	int _day;
//};
//
//int main()
//{
//	Date d1(1,1,1);
//	d1.Print();
//	//Date d2;//没有合适的默认构造函数可用
//	return 0;
//}


//////////////////////////////////////////
//string类
#include<iostream>
#include<string>
using namespace std;

void string_test1()
{
	//auto---自动推导变量类型
	int x = 0;
	auto y = x;
	//必须先初始化
	//auto z;//false

	//不能推导数组的类型
	//auto arr[] = { 1, 2, 3, 4 };//false
	

	//范围for 一般用于数组和容器对象
	int arry[] = { 0, 1, 2, 3 };
	for (auto e : arry)
	{
		cout << e << " ";
	}
	cout << endl;

	//注意e是arry的拷贝，所以一般使用引用
	//for (auto e : arry)
	for (auto& e : arry)
	{
		e *= 2;
	}
	for (auto e : arry)
	{
		cout << e << " ";
	}
	cout << endl;
}

void string_test2()
{
	//string的构造函数
	string s1();//无参
	string s2("hello world");//有参
	string s3(s2); //拷贝构造

	//string的遍历
	//1.下标 + []
	for (int i = 0; i < s2.size(); ++i)
	{
		cout << s2[i] << " ";
	}
	cout << endl;
	
	//2.迭代器
	//string::iterator ch = s2.begin();
	auto ch = s2.begin();  //使用auto更方便，但要明白变量的类型是什么
	while (ch != s2.end())
	{
		cout << *ch << " ";
		ch += 1;
	}
	cout << endl;

	//3.反向迭代器
	auto rit = s2.rbegin();
	while (rit != s2.rend())
	{
		cout << *rit << " ";
		rit += 1;
	}
	cout << endl;

	//4.范围for
	for (auto& e : s2)
	{
		cout << e << " ";
	}
	cout << endl;
}
int main()
{
	//string_test1();

	string_test2();
	return 0;
}